package com.jiang.专题.字符串.Q3;

import java.util.Arrays;

/**
 * @author Jiang
 * @version 1.0
 * @date 2024/12/11 18:33
 */
class Solution {
    public int lengthOfLongestSubstring(String s) {
//         使用数组 + 滑动窗口
         int[] arr = new int[128];
         Arrays.fill(arr, -1);
         int start = 0; // 窗口开始的位置
         int res = 0;
         for (int i = 0; i < s.length(); i++) {
             int index = s.charAt(i);
             start = Math.max(arr[index] + 1, start);
             res = Math.max(res, i - start + 1);
             arr[index] = i;
         }
         return res;


        // 使用Map + 滑动窗口
        // int n = s.length();
        // int res = 0;
        // int start = 0; // 窗口开始位置
        // HashMap<Character, Integer> map = new HashMap<>();
        // for (int i = 0; i < n; i++) {
        //     char index = s.charAt(i);
        //     if (map.containsKey(index)) {
        //         start = Math.max(start, map.get(index) + 1);
        //         map.replace(index, i);
        //     } else {
        //         map.put(index, i);
        //     }
        //     res = Math.max(res, i - start + 1);
        // }
        // return res;

        // 使用Set + 滑动窗口
        // Set<Character> set = new HashSet<>();//维护当前最长不重复字符子串
        // int left = 0;
        // int right = 0;
        // int max = 0;
        // while(right<s.length()){
        //     if(!set.contains(s.charAt(right))){
        //         //未查到重复字符就一直加，right右移
        //         set.add(s.charAt(right));
        //         right++;
        //     }else{
        //         //right查到重复字符先不动，left右移，set删left经过的字符，直到重复的这个字符删掉为止
        //         set.remove(s.charAt(left));
        //         left++;
        //     }
        //     //每一次计算当前set子串的长度
        //     max = Math.max(max, set.size());
        // }
        // return max;
    }
}
